#include_function".\src\lib_Marisa.txt"

//0.275
//11
//9,10,10,9
let DMG_MAINSHOT=3.025;
let DMG_LASER=[2.475,2.75,2.75,2.475];


sub onInitialize_MarisaB{
	onInitialize_Marisa;
	LoadPlayerShotData(csd~"src\data_playershot_mb.txt");
}



task Main{
	yield;
	MainShotFire;
	Options;
	BombEffect;
	th10_System;
}



task Options{
	let posx=[-32,-8,8,32];
	let posy=[0,-32,-32,0];
	let scale=1;
	let gang=0;
	let collision=false;
	let objl=[NULL,NULL,NULL,NULL];
	let cenx=GetPlayerX;
	let ceny=GetPlayerY;
	let scalex=1;
	let scaley=1;
	let dscale=0.05;
	let alpha=255;
	let dalpha=16;
	
	Move;
	CreateOptions;
	SlowMove;
	LaserControl;
	ScaleControl;
	VanishControl;
	Rotate;
	
	
	function CreateOptions{
		ascent(n in 0..4){Option(n);}
	}
	
	
	task Move{
		let ang;
		let distance;
		loop{
			if(OnMissed && !OnBorderOfLife){
				while(OnMissed){yield;}
				cenx=GetPlayerX;
				ceny=GetPlayerY;
			}else{
				ang=atan2(GetPlayerY-ceny,GetPlayerX-cenx);
				distance=((GetPlayerX-cenx)^2+(GetPlayerY-ceny)^2)^0.5;
				distance*=0.5;
				if(distance<1){
					cenx=GetPlayerX;
					ceny=GetPlayerY;
				}else{
					cenx+=distance*cos(ang);
					ceny+=distance*sin(ang);
				}
			}
			yield;
		}
	}
	
	
	task SlowMove{
		let slowx=[32,24,20,18,17,16.5,16.25,16];
		let slowy=[-32, -28, -26, -25, -24.5, -24.25, -24.125, -24];
		let fastx=[32,31.75,31.5,31,30,28,24,16];
		let fasty=[-32,-31.875,-31.75,-31.5,-31,-30,-28,-24];
		let n=0;
		
		loop{
			if(!OnMissed || OnBorderOfLife){
				if(GetKeyState(VK_SLOWMOVE)){
					if(n<8){
						posx[0]=-slowx[n];
						posy[1]=slowy[n];
						posy[2]=slowy[n];
						posx[3]=slowx[n];
						n++;
					}
				}else{
					if(n>0){
						n--;
						posx[0]=-fastx[n];
						posy[1]=fasty[n];
						posy[2]=fasty[n];
						posx[3]=fastx[n];
					}
				}
			}
			yield;
		}
	}
	
	
	task LaserControl{
		let c=0;
		loop{
			if(c%5==0){
				collision=true;
				c=0;
			}else{
				collision=false;
			}
			c++;
			yield;
		}
	}
	
	
	task ScaleControl{
		let ang=0;
		loop{
			scale=0.9-0.1*sin(ang);
			ang+=12;
			ang%=360;
			yield;
		}
	}
	
	
	task VanishControl{
		loop{
			if(OnMissed && !OnBorderOfLife){
				if(scalex>0){
					scalex-=dscale;
					scaley+=dscale;
				}
				if(alpha>0){
					alpha-=dalpha;
				}
			}else{
				scalex=1;
				scaley=1;
				alpha=255;
			}
			yield;
		}
	}
	
	
	task Rotate{
		loop{
			gang+=6;
			gang%=360;
			yield;
		}
	}
	
	
	task Option(num){
		let obje=Obj_Create(OBJ_EFFECT);
		let obj=Obj_Create(OBJ_EFFECT);
		
		let timer=10800;
		
		ObjEffect_SetTexture(obj,IMG_OPTION);
		ObjEffect_SetLayer(obj,2);
		ObjEffect_SetPrimitiveType(obj,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obj,4);
		ObjEffect_SetVertexUV(obj,0,16,0);
		ObjEffect_SetVertexUV(obj,1,16,16);
		ObjEffect_SetVertexUV(obj,2,32,0);
		ObjEffect_SetVertexUV(obj,3,32,16);
		ObjEffect_SetVertexXY(obj,0,-7,-7);
		ObjEffect_SetVertexXY(obj,1,-7,8);
		ObjEffect_SetVertexXY(obj,2,8,-7);
		ObjEffect_SetVertexXY(obj,3,8,8);
		
		ObjEffect_SetTexture(obje,IMG_OPTION);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ALPHA);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_CreateVertex(obje,4);
		ObjEffect_SetVertexUV(obje,0,16,16);
		ObjEffect_SetVertexUV(obje,1,16,32);
		ObjEffect_SetVertexUV(obje,2,32,16);
		ObjEffect_SetVertexUV(obje,3,32,32);
		ObjEffect_SetVertexXY(obje,0,-10.5,-10.5);
		ObjEffect_SetVertexXY(obje,1,-10.5,11.5);
		ObjEffect_SetVertexXY(obje,2,11.5,-10.5);
		ObjEffect_SetVertexXY(obje,3,11.5,11.5);
		
		while(!Obj_BeDeleted(obj)){
			if(OnMissed && !OnBorderOfLife){
				ObjEffect_SetRenderState(obj,ADD);
				ObjEffect_SetScale(obj,scalex,scaley);
			}else{
				ObjEffect_SetRenderState(obj,ALPHA);
				ObjEffect_SetScale(obj,scale,scale);
			}
			ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			
			Obj_SetPosition(obj,cenx+posx[num],ceny+posy[num]);
			Obj_SetPosition(obje,cenx+posx[num],ceny+posy[num]);
			
			if(
				(Obj_BeDeleted(objl[num]))&&
				((GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD))&&
				(!OnMissed)&&
				(!OnEvent)
			){
				Laser(num,false);
			}
			
			ObjEffect_SetAngle(obje,0,0,-gang);
			
			timer--;
			
			if(timer==0){
				Option(num);
				Obj_Delete(obj);
				Obj_Delete(obje);
				return;
			}
			yield;
		}
	}
	
	
	task Laser(num,flg){
		let alpha=128;
		let v=8;
		let y=0;
		let i=0;
		let j=0;
		let green=[0,63,127,191,255,191,127,63];
		let width=0;
		let r_data=[14,13.5,13,12.5,12,11.5,11,10.5,10,10.5,11,11.5,12,12.5,13,13.5];
		let r=r_data[0];
		let scale=0;
		let dscale=0.125;
		let timer=10800;
		
		if(flg){
			width=16;
			scale=1;
		}
		
		let obj=Obj_Create(OBJ_LASER);
		objl[num]=obj;
		Obj_SetAngle(obj,270);
		Obj_SetAutoDelete(obj,false);
		ObjShot_SetGraphic(obj,1);
		ObjShot_SetDamage(obj,DMG_LASER[num]);
		ObjLaser_SetWidth(obj,32);
		ObjLaser_SetLength(obj,516);
		ObjLaser_SetSource(obj,false);
		Obj_SetCollisionToPlayer(obj,false);
		
		let obje=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(obje,IMG_SHOT);
		ObjEffect_SetPrimitiveType(obje,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(obje,2);
		ObjEffect_SetRenderState(obje,ADD);
		ObjEffect_CreateVertex(obje,4);
		ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
		
		let objsource=Obj_Create(OBJ_EFFECT);
		ObjEffect_SetTexture(objsource,IMG_SHOT);
		ObjEffect_SetPrimitiveType(objsource,PRIMITIVE_TRIANGLESTRIP);
		ObjEffect_SetLayer(objsource,3);
		ObjEffect_SetRenderState(objsource,ADD);
		ObjEffect_CreateVertex(objsource,4);
		ascent(n in 0..4){ObjEffect_SetVertexColor(objsource,n,alpha,255,255,255);}
		ObjEffect_SetVertexUV(objsource,0,32,32);
		ObjEffect_SetVertexUV(objsource,1,32,64);
		ObjEffect_SetVertexUV(objsource,2,64,32);
		ObjEffect_SetVertexUV(objsource,3,64,64);
		
		while( 
			( (GetKeyState(VK_SHOT)==KEY_PUSH)||(GetKeyState(VK_SHOT)==KEY_HOLD) )&&
			(!OnMissed)&&
			(!OnEvent)
		){
			Obj_SetCollisionToPlayer(obj,collision);
			
			if(Obj_IsIntersected(obj)){
				i=5;
			}
			if(i>0){
				i--;
				ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,green[j%8],0);}
				j++;
			}else{
				ascent(n in 0..4){ObjEffect_SetVertexColor(obje,n,alpha,255,255,255);}
			}
			
			ObjEffect_SetVertexUV(obje,0,64,y);
			ObjEffect_SetVertexUV(obje,1,64,y+480);
			ObjEffect_SetVertexUV(obje,2,96,y);
			ObjEffect_SetVertexUV(obje,3,96,y+480);
			
			if(width<16){
				width+=2;
			}
			ObjEffect_SetVertexXY(obje,0,-width,-480);
			ObjEffect_SetVertexXY(obje,1,-width,0);
			ObjEffect_SetVertexXY(obje,2,width,-480);
			ObjEffect_SetVertexXY(obje,3,width,0);
			
			if(scale<1){
				scale+=dscale;
			}else{
				scale=1;
			}
			ObjEffect_SetScale(objsource,scale,scale);
			r=r_data[(10800-timer)%16];
			ObjEffect_SetVertexXY(objsource,0,-r,-r);
			ObjEffect_SetVertexXY(objsource,1,-r,r);
			ObjEffect_SetVertexXY(objsource,2,r,-r);
			ObjEffect_SetVertexXY(objsource,3,r,r);
			
			Obj_SetPosition(obj,cenx+posx[num],ceny+posy[num]+18);
			Obj_SetPosition(obje,cenx+posx[num],ceny+posy[num]);
			Obj_SetPosition(objsource,cenx+posx[num],ceny+posy[num]);
			
			y+=v;
			
			timer--;
			
			if(timer==0){
				Laser(num,true);
				Obj_Delete(obj);
				Obj_Delete(obje);
				Obj_Delete(objsource);
				return;
			}
			
			if(Obj_BeDeleted(obj)){
				Obj_Delete(obje);
				Obj_Delete(objsource);
				return;
			}
			yield;
		}
		Obj_Delete(obj);
		
		loop(8){
			ObjEffect_SetVertexUV(obje,0,64,y);
			ObjEffect_SetVertexUV(obje,1,64,y+480);
			ObjEffect_SetVertexUV(obje,2,96,y);
			ObjEffect_SetVertexUV(obje,3,96,y+480);
			if(width>0){
				width-=2;
				ObjEffect_SetVertexXY(obje,0,-width,-480);
				ObjEffect_SetVertexXY(obje,1,-width,0);
				ObjEffect_SetVertexXY(obje,2,width,-480);
				ObjEffect_SetVertexXY(obje,3,width,0);
			}
			scale-=dscale;
			ObjEffect_SetScale(objsource,scale,scale);
			ObjEffect_SetVertexXY(objsource,0,-r,-r);
			ObjEffect_SetVertexXY(objsource,1,-r,r);
			ObjEffect_SetVertexXY(objsource,2,r,-r);
			ObjEffect_SetVertexXY(objsource,3,r,r);
			Obj_SetPosition(obje,GetPlayerX+posx[num],GetPlayerY+posy[num]);
			Obj_SetPosition(objsource,GetPlayerX+posx[num],GetPlayerY+posy[num]);
			y+=v;
			yield;
		}
		Obj_Delete(obje);
		Obj_Delete(objsource);
	}
}